package com.forum.service.impl;

import cn.undraw.util.result.R;
import com.forum.common.LoginUtil;
import com.forum.dao.LikesDao;
import com.forum.entity.Collection;
import com.forum.entity.Concern;
import com.forum.entity.Likes;
import com.forum.entity.Result1;
import com.forum.service.LikesService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

@Service
@Slf4j
@AllArgsConstructor
public class LikesServicempl implements LikesService {

    // 构造器自动注入
    private final LikesDao likesDao;

    /**
     * 点赞
     */
    @Override
    public R dolikes(Integer noteId) {
//        int count = 0;
//        /**
//         * 方案一： 直接操作数据库
//         *  先拿用户id到数据库查
//         *  命中：表示用户在做取消点赞操作，删除该数据
//         *  未命中：表示用户在做点赞操作，新增数据
//         */
//        Goodorbad goodorbad = new Goodorbad();
//        goodorbad.setUserId(LoginUtil.getCurrentId());  //拿用户ID
//        goodorbad.setNoteId(noteId);
////        "select * from goodorbad where user_id = #{userId} and note_id = #{noteId}"
//        // 条件查询
//        List<Goodorbad> list = goodorbadDao.queryByCondition(goodorbad); // 永远最多只有一条
//        // 使用集合工具类判断集合是否为空
//        if (CollectionUtils.isEmpty(list)) {
//            // 没有查到用户信息，为新增操作  --------- 新增点赞
//            Goodorbad likes = new Goodorbad();
//            likes.setNoteId(noteId);
//            likes.setTimestamp(new Date());
//            likes.setUserId(LoginUtil.getCurrentId());
//            count = goodorbadDao.insert(likes);
//        } else {
//            // 查到了，为删除操作 ------ 取消点赞
//            // "delete from goodorbar where id = #{id}"
//            count = goodorbadDao.deleteById(list.get(0).getId());
//        }
//        return count > 0; // 0 > 0 false  1 > 0 true


        /**
         * 方案二 ： 按照状态去做新增或修改
         *  命中： 说明用户曾经点赞过，此时判断状态进行置反
         *  未命中： 插入数据并设置状态为点赞
         */

        Likes likes = new Likes();
        likes.setUserId(LoginUtil.getCurrentId());
        likes.setNoteId(noteId);
        // 条件查询
        List<Likes> list = likesDao.queryByLike(likes); // 永远最多只有一条
        if (CollectionUtils.isEmpty(list)) {
            // 未命中
            Likes l = new Likes();
            l.setNoteId(noteId);
            l.setTimestamp(LocalDateTime.now());
            l.setUserId(LoginUtil.getCurrentId());
            l.setActive(1);
            likesDao.insert(l);
            return R.ok("操作成功", l);
        } else {
            // 命中了
            // 取出当前数据的状态
            Integer active = list.get(0).getActive();
            Likes likes1 = new Likes();
            likes1.setId(list.get(0).getId());
            likes1.setNoteId(noteId);
            likes1.setTimestamp(LocalDateTime.now());
            likes1.setUserId(LoginUtil.getCurrentId());
            if (active == 1) {
                // 此时为点赞，则改为取消点赞
                likes1.setActive(0);
            } else {
                likes1.setActive(1);
            }
            likesDao.update(likes1);
            return R.ok("操作成功", likes1);
        }
        /**
         * 方案三： 使用redis记录用户点赞数据 ， 开启定时任务 每天 晚上12点 准时刷入到mysql做持久化数据
         */
    }

    /**
     * 收藏
     */
    @Override
    public R doCollection(Integer noteId) {
        int count = 0;
        Collection collection = new Collection();
        collection.setUserId(LoginUtil.getCurrentId());
        collection.setNoteId(noteId);
        // 条件查询
        List<Collection> list = likesDao.CollectionQueryByCondition(collection); // 永远最多只有一条
        if (CollectionUtils.isEmpty(list)) { //判断参数list等于0
            // 未命中
            Collection c = new Collection();
            c.setNoteId(noteId);
            c.setUserId(LoginUtil.getCurrentId());
            c.setTimeStamp(LocalDateTime.now());
            c.setUserId(LoginUtil.getCurrentId());
            c.setActive(1);
            likesDao.CollectionInsert(c);
            return R.ok("收藏成功", c);
        } else {
            // 命中了
            // 取出当前数据的状态
            Integer active = list.get(0).getActive();
            Collection c1 = new Collection();
            c1.setNoteId(noteId);
            c1.setUserId(LoginUtil.getCurrentId());
            c1.setTimeStamp(LocalDateTime.now());
            c1.setId(list.get(0).getId());
            if (active == 1) {
                // 此时为点赞，则改为取消点赞
                c1.setActive(0);
            } else {
                c1.setActive(1);
            }
            likesDao.CollectionUpdate(c1);
            return R.ok("收藏成功", c1);
        }
    }

    /**
     * 关注
     */
    @Override
    public Result1 doConcern(int bgzId) {
        /**
         *设置查询条件：被关注用户的ID等于传入参数中的followId
         * 执行查询获取被关注的用户对象
         * 提取被关注用户的用户名和备注信息
         * 创建FollowInfo对象，封装被关注用户的信息
         * 如果是要关注（isFollow为true）
         * 创建Follow实体对象，记录关注关系
         */
        // 检查用户是否存在
        Concern concern = new Concern();
        concern.setGzId(LoginUtil.getCurrentId()); //将用户ID赋给关注id
        concern.setBgzId(bgzId);
        //判断关注的是不是自己
        if (Objects.equals(concern.getGzId(), concern.getBgzId())) {
            return Result1.success("不能关注自己");
        }
        //从数据库中查找被关注的用户信息
        List<Concern> concernList = likesDao.selectConcern(concern);

        if (concernList.isEmpty()) { //判断参数list等于0
            // 没数据
            Concern c = new Concern();
            c.setCreateTime(LocalDateTime.now());
            c.setGzId(LoginUtil.getCurrentId());
            c.setBgzId(bgzId);
            likesDao.ConcernInsert(c);
            return Result1.success("关注成功");
        } else {
            // 有数据
            // 取消关注
            likesDao.ConcernDelete(bgzId);
            return Result1.success("取消关注");
        }
    }
}

